require "import"
import "android.speech.RecognizerIntent"
import "android.speech.SpeechRecognizer"
import "android.speech.RecognitionListener"
import "android.content.Intent"
import "android.net.Uri"

if not service.getEditText() then
    service.asyncSpeak("Text Box Not Found!")
    return false
end

local spokenLanguageByHemant = "hi-IN"
local translatedLanguageByHemant = "en"
local autoPunctuationByHemant = ". \n"

--[[ Special Thanks to Mr. Ashish Kaushik for assistance.
This plugin is made by Hemant Singal from India for the benefit of visually impaired community. 
It allows one to speak in language of one's own choice out of 148 languages supported by Google Voice Input as on May 12th 2024. 
The spoken text is them translated into language of one's own choice out of 134 languages supported by Google Translate at present.
The translated tex is inserted in the text box available on screen. 
It will also add punctuation or a combination of characters as per one's own choice.
The default autoPunctuation is  a "period followed by a space and line break or new line.

Change the spoken Language code from "hi-In" to any of 148  languages from Spoken Languages List given below.
Change the translated Language code from "en" to any of 134 languages from the below Translation Languages List given after Spoken Languages List.
A list of regional language list is given before the complete 
148 Spoken Languages and 134 Translation Languages Lists. 

Regional Spoken Languages List.

1. Bengali (India) - "bn-IN"
2. English (India) - "en-IN"
3. Gujarati (India) - "gu-IN"
4. Hindi (India) - "hi-IN"
5. Kannada (India) - "kn-IN"
6. Malayalam (India) - "ml-IN"
7. Marathi (India) - "mr-IN"
8. Nepali (Nepal) - "ne-NP"
9. Pashto - "ps"
10. Punjabi (India) - "pa-IN"
11. Tamil (India) - "ta-IN"
12. Telugu (India) - "te-IN"
13. Urdu (India) - "ur-IN"
14. Urdu (Pakistan) - "ur-PK"

Regional Translation Languages List.

1. Arabic - "ar"
2. Assamese - "as"
3. Bengali - "bn"
4. Bhojpuri - "bho"
5. Dogri - "doi"
6. English - "en"
7. Gujarati - "gu"
8. Hindi - "hi"
9. Kannada - "kn"
10. Konkani - "gom"
11. Malayalam - "ml"
12. Marathi - "mr"
13. Meiteilon (Manipuri) - "mni-Mtei"
14. Nepali - "ne"
15. Odia (Oriya) - "or"
16. Punjabi - "pa"
17. Sanskrit - "sa"
18. Sindhi - "sd"
19. Tamil - "ta"
20. Telugu - "te"
21. Urdu - "ur"

This is the list of 148 languages supported by Google Voice Input in the same order as available in mobile. 
as on May 12th 2024.

1. Afrikaans (South Africa) - "af-ZA"
2. Azerbaijani - "az"
3. Indonesian (Indonesia) - "id-ID"
4. Malay (Malaysia) - "ms-MY"
5. Javanese (Indonesia) - "jv-ID"
6. Sundanese (Indonesia) - "su-ID"
7. Catalan (Spain) - "ca-ES"
8. Czech (Czech Republic) - "cs-CZ"
9. Danish (Denmark) - "da-DK"
10. German (Belgium) - "de-BE"
11. German (Germany) - "de-DE"
12. German (Austria) - "de-AT"
13. German (Switzerland) - "de-CH"
14. Estonian (Estonia) - "et-EE"
15. English (Australia) - "en-AU"
16. English (Canada) - "en-CA"
17. English (Generic) - "en"
18. English (Ghana) - "en-GH"
19. English (India) - "en-IN"
20. English (Indonesia) - "en-ID"
21. English (Ireland) - "en-IE"
22. English (Kenya) - "en-KE"
23. English (New Zealand) - "en-NZ"
24. English (Nigeria) - "en-NG"
25. English (Philippines) - "en-PH"
26. English (Singapore) - "en-SG"
27. English (South Africa) - "en-ZA"
28. English (Tanzania) - "en-TZ"
29. English (Thailand) - "en-TH"
30. English (UK) - "en-GB"
31. English (US) - "en-US"
32. Spanish (Argentina) - "es-AR"
33. Spanish (Bolivia) - "es-BO"
34. Spanish (Chile) - "es-CL"
35. Spanish (Colombia) - "es-CO"
36. Spanish (Costa Rica) - "es-CR"
37. Spanish (Ecuador) - "es-EC"
38. Spanish (USA) - "es-US"
39. Spanish (El Salvador) - "es-SV"
40. Spanish (Nicaragua) - "es-NI"
41. Spanish (Spain) - "es-ES"
42. Spanish (Guatemala) - "es-GT"
43. Spanish (Honduras) - "es-HN"
44. Spanish (Mexico) - "es-MX"
45. Spanish (Panama) - "es-PA"
46. Spanish (Paraguay) - "es-PY"
47. Spanish (Peru) - "es-PE"
48. Spanish (Puerto Rico) - "es-PR"
49. Spanish (Dominican Republic) - "es-DO"
50. Spanish (Uruguay) - "es-UY"
51. Spanish (Venezuela) - "es-VE"
52. Basque (Spain) - "eu-ES"
53. Filipino (Philippines) - "fil-PH"
54. French (Belgium) - "fr-BE"
55. French (France) - "fr-FR"
56. French (Canada) - "fr-CA"
57. French (Switzerland) - "fr-CH"
58. Galician (Spain) - "gl-ES"
59. Croatian (Croatia) - "hr-HR"
60. Kinyarwanda (Rwanda) - "rw-RW"
61. Southern Ndebele (South Africa) - "nr-ZA"
62. Xhosa (South Africa) - "xh-ZA"
63. Zulu (South Africa) - "zu-ZA"
64. Icelandic (Iceland) - "is-IS"
65. Italian (Switzerland) - "it-CH"
66. Lithuanian (Lithuania) - "lt-LT"
67. Italian (Italy) - "it-IT"
68. Swahili (Kenya) - "sw-KE"
69. Swahili (Tanzania) - "sw-TZ"
70. Latvian (Latvia) - "lv-LV"
71. Hungarian (Hungary) - "hu-HU"
72. Dutch (Netherlands) - "nl-NL"
73. Norwegian Bokmål (Norway) - "nb-NO"
74. Uzbek (Uzbekistan) - "uz-UZ"
75. Polish (Poland) - "pl-PL"
76. Portuguese (Brazil) - "pt-BR"
77. Portuguese (Portugal) - "pt-PT"
78. Romanian (Romania) - "ro-RO"
79. Sotho (South Africa) - "st-ZA"
80. Sotho (Lesotho) - "st-LS"
81. Northern Sotho (South Africa) - "nso-ZA"
82. Tswana (South Africa) - "tn-ZA"
83. Tswana (Botswana) - "tn-BW"
84. Albanian (Albania) - "sq-AL"
85. Swati (eSwatini) - "ss-SZ"
86. Swati (South Africa) - "ss-ZA"
87. Slovenian (Slovenia) - "sl-SI"
88. Slovak (Slovakia) - "sk-SK"
89. Finnish (Finland) - "fi-FI"
90. Swedish (Sweden) - "sv-SE"
91. Vietnamese (Vietnam) - "vi-VN"
92. Venda (South Africa) - "ve-ZA"
93. Turkish (Turkey) - "tr-TR"
94. Tsonga (South Africa) - "ts-ZA"
95. Greek (Greece) - "el-GR"
96. Bulgarian (Bulgaria) - "bg-BG"
97. Macedonian (North Macedonia) - "mk-MK"
98. Mongolian (Mongolia) - "mn-MN"
99. Russian (Russia) - "ru-RU"
100. Serbian (Serbia) - "sr-RS"
101. Ukrainian (Ukraine) - "uk-UA"
102. Kazakh (Kazakhstan) - "kk-KZ"
103. Georgian (Georgia) - "ka-GE"
104. Armenian (Armenia) - "hy-AM"
105. Hebrew (Israel) - "iw-IL"
106. Arabic (Israel) - "ar-IL"
107. Arabic (Jordan) - "ar-JO"
108. Arabic (UAE) - "ar-AE"
109. Arabic (Bahrain) - "ar-BH"
110. Arabic (Algeria) - "ar-DZ"
111. Arabic (Saudi Arabia) - "ar-SA"
112. Arabic (Kuwait) - "ar-KW"
113. Arabic (Morocco) - "ar-MA"
114. Arabic (Tunisia) - "ar-TN"
115. Arabic (Oman) - "ar-OM"
116. Arabic (Palestine) - "ar-PS"
117. Arabic (Egypt) - "ar-EG"
118. Persian (Iran) - "fa-IR"
119. Arabic (Qatar) - "ar-QA"
120. Arabic (Lebanon) - "ar-LB"
121. Urdu (Pakistan) - "ur-PK"
122. Urdu (India) - "ur-IN"
123. Amharic (Ethiopia) - "am-ET"
124. Hindi (India) - "hi-IN"
125. Punjabi (India) - "pa-IN"
126. Tamil (India) - "ta-IN"
127. Tamil (Sri Lanka) - "ta-LK"
128. Tamil (Singapore) - "ta-SG"
129. Tamil (Malaysia) - "ta-MY"
130. Bengali (Bangladesh) - "bn-BD"
131. Bengali (India) - "bn-IN"
132. Khmer (Cambodia) - "km-KH"
133. Kannada (India) - "kn-IN"
134. Marathi (India) - "mr-IN"
135. Gujarati (India) - "gu-IN"
136. Sinhala (Sri Lanka) - "si-LK"
137. Telugu (India) - "te-IN"
138. Malayalam (India) - "ml-IN"
139. Nepali (Nepal) - "ne-NP"
140. Lao (Laos) - "lo-LA"
141. Thai (Thailand) - "th-TH"
142. Mandarin Chinese (Taiwan) - "zh-TW"
143. Burmese (Myanmar) - "my-MM"
144. Korean (South Korea) - "ko-KR"
145. Mandarin Chinese (Mainland China) - "zh-CN"
146. Mandarin Chinese (Hong Kong) - "zh-HK"
147. Cantonese (Hong Kong) - "yue-Hant-HK"
148. Japanese (Japan) - "ja-JP"

Translation Languages List. This is the list of 134 languages supported by Google Translate as on May 12th 2024.

1. Afrikaans - "af"
2. Albanian - "sq"
3. Amharic - "am"
4. Arabic - "ar"
5. Armenian - "hy"
6. Assamese - "as"
7. Aymara - "ay"
8. Azerbaijani - "az"
9. Bambara - "bm"
10. Basque - "eu"
11. Belarusian - "be"
12. Bengali - "bn"
13. Bhojpuri - "bho"
14. Bosnian - "bs"
15. Bulgarian - "bg"
16. Catalan - "ca"
17. Cebuano - "ceb"
18. Chinese (Simplified) - "zh-CN" or "zh" (BCP-47)
19. Chinese (Traditional) - "zh-TW" (BCP-47)
20. Corsican - "co"
21. Croatian - "hr"
22. Czech - "cs"
23. Danish - "da"
24. Dhivehi - "dv"
25. Dogri - "doi"
26. Dutch - "nl"
27. English - "en"
28. Esperanto - "eo"
29. Estonian - "et"
30. Ewe - "ee"
31. Filipino (Tagalog) - "fil"
32. Finnish - "fi"
33. French - "fr"
34. Frisian - "fy"
35. Galician - "gl"
36. Georgian - "ka"
37. German - "de"
38. Greek - "el"
39. Guarani - "gn"
40. Gujarati - "gu"
41. Haitian Creole - "ht"
42. Hausa - "ha"
43. Hawaiian - "haw"
44. Hebrew - "he" or "iw"
45. Hindi - "hi"
46. Hmong - "hmn"
47. Hungarian - "hu"
48. Icelandic - "is"
49. Igbo - "ig"
50. Ilocano - "ilo"
51. Indonesian - "id"
52. Irish - "ga"
53. Italian - "it"
54. Japanese - "ja"
55. Javanese - "jv" or "jw"
56. Kannada - "kn"
57. Kazakh - "kk"
58. Khmer - "km"
59. Kinyarwanda - "rw"
60. Konkani - "gom"
61. Korean - "ko"
62. Krio - "kri"
63. Kurdish - "ku"
64. Kurdish (Sorani) - "ckb"
65. Kyrgyz - "ky"
66. Lao - "lo"
67. Latin - "la"
68. Latvian - "lv"
69. Lingala - "ln"
70. Lithuanian - "lt"
71. Luganda - "lg"
72. Luxembourgish - "lb"
73. Macedonian - "mk"
74. Maithili - "mai"
75. Malagasy - "mg"
76. Malay - "ms"
77. Malayalam - "ml"
78. Maltese - "mt"
79. Maori - "mi"
80. Marathi - "mr"
81. Meiteilon (Manipuri) - "mni-Mtei"
82. Maltese - "mt"
83. Mongolian - "mn"
84. Myanmar (Burmese) - "my"
85. Nepali - "ne"
86. Norwegian - "no"
87. Nyanja (Chichewa) - "ny"
88. Odia (Oriya) - "or"
89. Oromo - "om"
90. Pashto - "ps"
91. Persian - "fa"
92. Polish - "pl"
93. Portuguese (Portugal, Brazil) - "pt"
94. Punjabi - "pa"
95. Quechua - "qu"
96. Romanian - "ro"
97. Russian - "ru"
98. Samoan - "sm"
99. Sanskrit - "sa"
100. Scots Gaelic - "gd"
101. Sepedi - "nso"
102. Serbian - "sr"
103. Sesotho - "st"
104. Shona - "sn"
105. Sindhi - "sd"
106. Sinhala (Sinhalese) - "si"
107. Slovak - "sk"
108. Slovenian - "sl"
109. Somali - "so"
110. Spanish - "es"
111. Sundanese - "su"
112. Swahili - "sw"
113. Swedish - "sv"
114. Tagalog (Filipino) - "tl"
115. Tajik - "tg"
116. Tamil - "ta"
117. Tatar - "tt"
118. Telugu - "te"
119. Thai - "th"
120. Tigrinya - "ti"
121. Tsonga - "ts"
122. Turkish - "tr"
123. Turkmen - "tk"
124. Twi (Akan) - "ak"
125. Ukrainian - "uk"
126. Urdu - "ur"
127. Uyghur - "ug"
128. Uzbek - "uz"
129. Vietnamese - "vi"
130. Welsh - "cy"
131. Xhosa - "xh"
132. Yiddish - "yi"
133. Yoruba - "yo"
134. Zulu - "zu"

]]

local recordIntent = Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH)
recordIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM)
recordIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, spokenLanguageByHemant)
local speechRecord = SpeechRecognizer.createSpeechRecognizer(service)
speechRecord.setRecognitionListener{
    onResults = function(results)
        local spokenText = results.getParcelableArrayList(SpeechRecognizer.RESULTS_RECOGNITION).get(0)

        Http.get("https://translate.google.com/m?sl=auto&hl=" .. translatedLanguageByHemant .. "&q=" .. Uri.encode(spokenText), function(status, result)
            if status == 200 then
                local translatedText = result:match('<div class="result%-container">([^<]+)</div>')
                service.insertText(service.getEditText(), translatedText .. autoPunctuationByHemant)
                service.speak(translatedText)
            end
        end)
        speechRecord.destroy()
    end,
    onError = function()
        speechRecord.destroy()
        service.asyncSpeak("I Did Not Understand Your Message!")
    end
}

speechRecord.startListening(recordIntent)